8

前言

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器

安装

  • yum安装
  • 源码安装

yum安装

以CentOS6.5 为例

设置yum源, vi etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/x86_64/
gpgcheck=0
enabled=1

设置代理 vi /etc/yum.conf (公网情况下可忽略)

proxy=代理IP

命令安装

sudo yum install nginx

源码安装

下载nginx源码

wget http://nginx.org/download/nginx-1.13.12.tar.gz

tar -xvzf nginx-1.13.12.tar.gz

cd nginx-1.13.12

./configure --prefix=/usr/local/nginx

make

sudo make install

模块扩展安装

在安装nginx的时候, 往往会有配置需求, 同时如果我们想要安装一个第三方的模块, 则需要 --add-module 进行设置. 例如下面要求

已知第三方模块


git clone https://github.com/alibaba/nginx-http-concat.git

# nginx 编译  
./configure --add-module=/path/to/nginx-http-concat

make 

sudo make install

源码重新编译

有时候, 我们需要给现有的nginx加入一些扩展模块. 那么就需要通过对应的版本的源代码, 重新configure, 具体步骤如下:

# 老的nginx 执行 nginx -V
/usr/local/nginx/sbin/nginx -V

# nginx 同一版本下的源码 执行 configure, 附加新的模块
./configure --prefix=/usr/local/nginx --add-module=/path/to/nginx-http-concat

# 编译
make

# 备份老的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

# 将objs目录下产生新的 nginx 覆盖老的nginx
cp objs/nginx /usr/local/nginx/sbin/nginx

# 如果出现文件打开错误,运行下面这句
mkdir -p /dev/shm/nginx_temp/client_body

# 测试
sudo /usr/local/nginx/sbin/nginx -t

# 平滑重启nginx
sudo /usr/local/nginx/sbin/nginx -s reload

nginx配置

基本配置

user www www; # 用户名 用户组

http {
    # http服务设置
      
    # 引入多个mime类型
    include mime.types;
    
    # 启用gzip压缩
    gzip on;
    
    # 错误页面重定向
    error_page  400 401 402 403 404 405 408 410 412 413 414 415 500 501 502 503 506 = /error.html;
    
    # 引入额外配置
    include vhosts/*.conf;
}

虚拟主机配置

用户请求 host为 liylblog.com 主机时, 将访问 root 目录下的资源

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
}

路由匹配设置

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
    
    # 最长优先匹配, 所以 / 为最后匹配规则
    location / {
        # 设置默认的index文件名称
        index index.html index.html;
        try_files $uri $uri/;
    }
    
    # 以.php结尾或者 .php/xxx 结尾的路径, ~ 表示大小写敏感
    location ~ \.php($|/) {
        # 规则
    }
    
    # 大小写敏感, 以 /img/ 开头的资源路径将被匹配
    # /img/logo.png
    # /img/avatar.png
    location ^~ /img/ {
        # 规则
    }
    
    # 大小写敏感, 匹配 /api 资源
    location ^~ = /api {
        f( !-e $request_filename )
        {
            rewrite ^/api /api/ last;
        }
    }
}

nginx 配置负载均衡


server {
    listen       80;
    server_name  liylblog.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-forwarded-For $proxy_add_x_forwarded_for;
        
        # 重定向请求
        proxy_pass http://proxy_stream;
    }
}

# 多台机器代理, 背后可能是其它web服务器
upstream proxy_stream {
    server 192.168.1.1 max_fails=3 fail_timeout=30s;
    server 192.168.1.2 max_fails=3 fail_timeout=30s;
}

反向代理

PHP-FPM代理

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
    access_log /usr/local/nginx/logs/liylblog.access.log;
    error_log  /usr/local/nginx/logs/liylblog.error.log;

    location / {
        index  index.html index.htm index.php;
        if (!-e $request_filename) { ## if 后面必须有空格
            rewrite ^(.*)$ /index.php?s=$1 last;
            break;
        }
    }
    # 大小写敏感, 匹配.php后缀结尾或者 .php/ 结尾的路径
    location ~ \.php($|/) {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        client_max_body_size 100M;
        fastcgi_connect_timeout 300s;
        fastcgi_send_timeout 300s;
        fastcgi_read_timeout 300s;
        include fastcgi_params;
     }

}

Node.js 代理

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
    access_log /usr/local/nginx/logs/liylblog.access.log;
    error_log  /usr/local/nginx/logs/liylblog.error.log;

    location @proxy {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://localhost:7001;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_cache_key sfs$request_uri$scheme;
    }   

    location / { 
        autoindex on; 
        index  index.html index.htm;
        # 尝试访问地址 例如, 访问 $root/foo, $root/foo/index.html, $root/foo/index.htm, $proxy/foo; 
        try_files $uri $uri/ @proxy;
    }   
}

小结

nginx 是一个优秀的代理服务器, 还有很多未知的知识亟待去挖掘


wayneli
1.4k 声望828 粉丝

2017-2018年目标